package lambda;

import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;

/*
 *  JDK8之后,推出了一个新的特性:lambda表达式
 *  lambda表达式可以用更精简的代码创建匿名内部类
 *  语法:
 *  (参数列表)->{
 *      方法体
 *  }
 * 使用lambda表达式的前提是:接口内部只能实现一个抽象方法
 */
public class LambdaDemo {
    public static void main(String[] args) {
        //ctrl+alt+v alt+enter
        //ctrl+Z 撤销 ctrl+C 赋值 ctrl+V 粘贴 ctrl+X 剪切
        FileFilter fileFilter = new FileFilter() {
            @Override
            public boolean accept(File file) {
                return file.getName().contains("o");
            }
        };
        //忽略接口名和方法名
        /*
         * 将new FileFilter()忽略,因为我们声明变量时,已经表示了接口的类型
         * 将accept方法的声明忽略,因为lambda表达式的前提是只能改写有一个抽象方法的接口
         * 所以不写方法,底层也知道要重写哪个方法
         */
        FileFilter fileFilter1 = (File file) -> {
            return file.getName().contains("o");
        };
        //忽略参数类型 底层会自动按照方法的参数顺序去匹配
        FileFilter fileFilter2 = (file) -> {
            return file.getName().contains("o");
        };
        //如果重写方法只有一个参数时,"()"也可以省略
        FileFilter fileFilter3 = file -> {
            return file.getName().contains("o");
        };
        //如果方法体只有一句代码,那么可以将方法体的"{}"忽略,如果含有return,也要一同忽略
        FileFilter fileFilter4 = file -> file.getName().contains("o");
        File dir = new File(".");
        File[] os = dir.listFiles(file -> file.getName().contains("o"));
        System.out.println(Arrays.toString(os));
    }
}
